package _array

/**
 *
 * https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
 * https://leetcode.cn/problems/spiral-matrix-ii/description/
 *
 * 给定一个正整数 n，生成一个包含 1 到 n^2 所有元素，且元素按顺时针顺序螺旋排列的正方形矩阵。
 *
 * 输入：n = 3
 * 输出：[[1,2,3],[8,9,4],[7,6,5]]
 *
 * 输入：n = 1
 * 输出：[[1]]
 *
 * 输入：n = 4
 * 输出：[[1,2,3,4],[12,13,14,5],[11,16,15,16],[10,9,8,7]]
 *
 * 考什么？
 * 不考算法，就是模拟过程，察对代码的掌控能力。
 */
class Test9 {
    private class Solution {
        /**
         * @Test
         * public void test() {
         * int[][] result = generateMatrix(3);
         * String actual = Arrays.deepToString(result);
         * String expected = "[[1, 2, 3], [8, 9, 4], [7, 6, 5]]";
         * Assert.assertEquals(expected, actual);
         * }
         */
        fun generateMatrix(n: Int): Array<IntArray> {
            // https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html#%E6%80%9D%E8%B7%AF
            // T - N * N
            // S - N * N
            val array = Array(n) { IntArray(n) }

            var i = 0
            var j = 0
            var startX = 0
            var startY = 0

            var count = 1
            var loop = n / 2
            var offset = 1

            while (loop > 0) {
                i = startX
                j = startX

                // 1, 2
                while (j < n - offset) {
                    // 2
                    array[i][j] = count++
                    j++
                }

                // 3
                // 4
                while (i < n - offset) {
                    array[i][j] = count++
                    i++
                }

                //  6 5
                while (j > startY) {
                    // 2 > 0
                    array[i][j] = count++
                    j--
                }

                // 8
                // 7
                while (i > startX) {
                    array[i][j] = count++
                    i--
                }

                loop--
                startX++
                startY++
                offset++
            }

            // 9
            if (n % 2 != 0) {
                val mid = n / 2 // 1,1
                array[mid][mid] = n * n // count
            }
            return array
        }
    }
}